﻿#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    init();
    ui->pbn_destroy->setEnabled(false);
    ui->pbn_init->setEnabled(true);
    ui->sb_boy_dis->setEnabled(false);
    ui->sb_gril_dis->setEnabled(false);
    ui->pbn_boy_add->setEnabled(false);
    ui->pbn_gril_add->setEnabled(false);
    m_boy = nullptr;
    m_gril = nullptr;
}

Dialog::~Dialog()
{
    delete ui;
}

//主要练习控制字体，以及元对象属性相关练习
//定义一个类，通过元对象设置和获取相关变量信息。

//在进行相关显示的时候，字体可以设置斜体，粗体，下划线等，以及字体的颜色。
//这种选择类的槽函数  一般选择带参数的这种

//通过一个槽函数优化  这里是因为RadioBlue的特性  用clicked()不带参数即可
void Dialog::init()
{
    connect(ui->rb_red, SIGNAL(clicked()), this, SLOT(do_setFontColor()));
    connect(ui->rb_blue, SIGNAL(clicked()), this, SLOT(do_setFontColor()));
    connect(ui->rb_black, SIGNAL(clicked()), this, SLOT(do_setFontColor()));
}

//Plain Text Edit 和TextEdit 一样
void Dialog::do_setFontColor()
{
    QPalette plet = ui->te_Display->palette();
    QPalette plet1 = ui->pte_Display->palette();
    if(ui->rb_red->isChecked())
    {
        plet.setColor(QPalette::Text, Qt::red);
        plet1.setColor(QPalette::Text, Qt::red);
    }
    else if(ui->rb_blue->isChecked())
    {
        plet.setColor(QPalette::Text, Qt::blue);
        plet1.setColor(QPalette::Text, Qt::blue);
    }
    else
    {
        plet.setColor(QPalette::Text, Qt::black);
        plet1.setColor(QPalette::Text, Qt::black);
    }

    ui->te_Display->setPalette(plet);
    ui->pte_Display->setPalette(plet1);
}


//Plain Text Edit和TextEdit都是可以的
//void Dialog::on_rb_red_clicked(bool checked)
//{
//    if(!checked) return;
//    QPalette plet = ui->te_Display->palette();
//    plet.setColor(QPalette::Text, Qt::red);
//    ui->te_Display->setPalette(plet);

//    QPalette plet1 = ui->te_Display->palette();
//    plet1.setColor(QPalette::Text, Qt::red);
//    ui->pte_Display->setPalette(plet1);
//}

//void Dialog::on_rb_blue_clicked(bool checked)
//{
//    if(!checked) return;
//    QPalette plet = ui->te_Display->palette();
//    plet.setColor(QPalette::Text, Qt::blue);
//    ui->te_Display->setPalette(plet);

//    QPalette plet1 = ui->te_Display->palette();
//    plet1.setColor(QPalette::Text, Qt::blue);
//    ui->pte_Display->setPalette(plet1);
//}

//void Dialog::on_rb_black_clicked(bool checked)
//{
//    if(!checked) return;
//    QPalette plet = ui->te_Display->palette();
//    plet.setColor(QPalette::Text, Qt::black);
//    ui->te_Display->setPalette(plet);

//    QPalette plet1 = ui->te_Display->palette();
//    plet1.setColor(QPalette::Text, Qt::black);
//    ui->pte_Display->setPalette(plet1);
//}

//这里对TextEdit 和Plain TextEdit进行测试 发现这种设置TextEdit有点问题
void Dialog::on_cb_underline_clicked(bool checked)
{
    QFont font = ui->te_Display->font();
    font.setUnderline(checked); //其他可以参考
    ui->te_Display->setFont(font);

    QFont font1 = ui->te_Display->font();
    font1.setUnderline(checked); //其他可以参考
    ui->pte_Display->setFont(font1);
}

void Dialog::on_cb_italic_clicked(bool checked)
{
//    ui->te_Display->setFontItalic(checked);

    QFont font = ui->te_Display->font();
    font.setItalic(checked); //其他可以参考
    ui->te_Display->setFont(font);

    QFont font1 = ui->te_Display->font();
    font1.setItalic(checked); //其他可以参考
    ui->pte_Display->setFont(font1);
}

void Dialog::on_cb_bold_clicked(bool checked)
{
    QFont font = ui->te_Display->font();
    font.setBold(checked);
    ui->te_Display->setFont(font);

    QFont font1 = ui->te_Display->font();
    font1.setBold(checked); //其他可以参考
    ui->pte_Display->setFont(font1);
}
//以上已经参考demo实现了简单的常用的字体控制了，其他的可以类推。
//文本显示栏中部分字体的处理，待研究
void Dialog::person_init()
{
    m_boy = new TPerson("小明", this); //这种设置父对象会由父对象释放？
    m_gril = new TPerson("小丽", this);

    m_boy->setAge(12);
    m_gril->setAge(13);

    //初始化  内部变量和界面要一致
    ui->sb_boy_dis->setValue(22);
    ui->sb_gril_dis->setValue(32);

    //需要绑定槽函数  触发日志的打印
    m_boy->setProperty("age", 22);
    m_boy->setProperty("score", 22);
    m_boy->setProperty("sex", "boy"); //动态的
    m_gril->setProperty("age", 32);
    m_gril->setProperty("score", 32);
    m_gril->setProperty("sex", "gril"); //动态的
    connect(m_boy, SIGNAL(ageChanged(int)), this, SLOT(do_ageChanged(int)));
    connect(m_gril, &TPerson::ageChanged, this, &Dialog::do_ageChanged);
}

void Dialog::person_destory()
{
    ui->sb_boy_dis->setValue(0);
    ui->sb_gril_dis->setValue(0);
    disconnect(m_boy, SIGNAL(ageChanged(int)), this, SLOT(do_ageChanged(int)));
    disconnect(m_gril, &TPerson::ageChanged, this, &Dialog::do_ageChanged);

    if(m_boy)
    {
        delete m_boy;
        m_boy = nullptr;
    }
    if(m_gril)
    {
        delete m_gril;
        m_gril = nullptr;
    }
}

void Dialog::on_pbn_init_clicked()
{
    person_init();
    ui->pbn_boy_add->setEnabled(true);
    ui->pbn_gril_add->setEnabled(true);
    ui->sb_boy_dis->setEnabled(true);
    ui->sb_gril_dis->setEnabled(true);

    ui->pbn_init->setEnabled(false);
    ui->pbn_destroy->setEnabled(true);
}

void Dialog::on_pbn_destroy_clicked()
{
    person_destory();
    ui->pbn_boy_add->setEnabled(false);
    ui->pbn_gril_add->setEnabled(false);
    ui->sb_boy_dis->setEnabled(false);
    ui->sb_gril_dis->setEnabled(false);

    ui->pbn_init->setEnabled(true);
    ui->pbn_destroy->setEnabled(false);
}

#include <QDebug>
//这里触发对应的元对象值变化
void Dialog::on_sb_boy_dis_valueChanged(int arg1)
{
//    qDebug()<<"get data:"<<arg1;
//    m_boy->addOneAge(); //这里只做了长大一岁的处理  没做减一的动作
    m_boy->setAge(arg1);
}

void Dialog::on_sb_gril_dis_valueChanged(int arg1)
{
//    qDebug()<<"get gril data:"<<arg1;
//    m_gril->addOneAge();
    m_gril->setAge(arg1);
}

//这里触发对应原对象的值变化和spinbox的值变化
void Dialog::on_pbn_boy_add_clicked()
{
    int data = ui->sb_boy_dis->value();
    ui->sb_boy_dis->setValue(data+1);

    //这里在触发内部值的变化
//    m_boy->addOneAge();
}

void Dialog::on_pbn_gril_add_clicked()
{
    int data = ui->sb_gril_dis->value();
    ui->sb_gril_dis->setValue(data+1); //传递到控件的触发
//    m_gril->addOneAge();
}

//这里打印相关元属性信息
#include <QMetaProperty>
void Dialog::on_pbn_info_clicked()
{
    if(m_boy ==nullptr ||m_gril == nullptr)
    {
        ui->pte_Display->setPlainText("成员对象为空，请先构造。");
        return;
    }
    QObject *obj=m_boy;
    const QMetaObject *meta = obj->metaObject();
    ui->pte_Display->setPlainText("类名称："+QString(meta->className()));

    ui->pte_Display->appendPlainText("property");
//    for (int i=0;i<meta->propertyCount();i++)
    for (int i=meta->propertyOffset();i<meta->propertyCount();i++)
    {

        QMetaProperty property = meta->property(i);

        const char* propName = property.name();
        QString propValue=obj->property(propName).toString();
        QString str=QString("属性名称=%1，属性值=%2").arg(propName).arg(propValue);
        ui->pte_Display->appendPlainText(str);
    }

    ui->pte_Display->appendPlainText("");
    ui->pte_Display->appendPlainText("classInfo");
    for (int i=meta->classInfoOffset();i<meta->classInfoCount();++i)
    {
        QMetaClassInfo classInfo=meta->classInfo(i);
        ui->pte_Display->appendPlainText(QString("Name=%1; Value=%2").arg(classInfo.name()).arg(classInfo.value()));
    }
}


//清空对应显示框的内容
void Dialog::on_pbn_clear_display_clicked()
{
    ui->te_Display->clear();
    ui->pte_Display->clear();
//    ui->sb_boy_dis->setValue(0);
//    ui->sb_gril_dis->setValue(0);

}

//这里是触发内部值的变化
void Dialog::do_ageChanged(int value)
{
    //获取发生变化的对应 进行必要信息的打印
    Q_UNUSED(value);
    TPerson* person = qobject_cast<TPerson*>(sender());
    QString his_name = person->property("name").toString();
    QString his_sex = person->property("sex").toString();
    int his_age = person->property("age").toInt();
    int his_age1 = person->getAge();

    QString display = QString("%1,%2,年龄= %3,%4").arg(his_name).arg(his_sex).arg(his_age).arg(his_age1);
    ui->te_Display->append(display);
}
